export const colors = [
  '#5274E9', // 紫色
  '#14AC85', // 蓝色
  '#8053CE', // 绿色
  '#FFD33E', // 黄色
  '#FF5454',
  '#CAEC57',
  '#78D43B',
  '#FF68C6',
  '#29A6D8',
  '#7A4E15',
  '#4023FF',
]

/**
 * 节流函数
 * @param {*} func 回调函数
 * @param {*} wait 节流时间
 * @returns
 */
export function throttle(func, wait) {
  var timeout, context, args, result
  var previous = 0

  var later = function () {
    previous = Date.now()
    timeout = null
    result = func.apply(context, args)
  }

  var throttled = function () {
    var now = Date.now()
    var remaining = wait - (now - previous)
    context = this
    args = arguments
    if (remaining <= 0) {
      if (timeout) {
        clearTimeout(timeout)
        timeout = null
      }
      previous = now
      result = func.apply(context, args)
    } else if (!timeout) {
      timeout = setTimeout(later, remaining)
    }
    return result
  }
  return throttled
}

function isObject(obj) {
  return Object.prototype.toString.call(obj) === '[object Object]'
}
function isArray(arr) {
  return Array.isArray(arr)
}
/**
 * 对象合并
 */
export function _merge(target, ...arg) {
  return arg.reduce((acc, cur) => {
    return Object.keys(cur).reduce((subAcc, key) => {
      const srcVal = cur[key]
      if (isObject(srcVal)) {
        subAcc[key] = _merge(subAcc[key] ? subAcc[key] : {}, srcVal)
      } else if (isArray(srcVal)) {
        // series: []，下层数组直接赋值
        subAcc[key] = srcVal.map((item, idx) => {
          if (isObject(item)) {
            const curAccVal = subAcc[key] ? subAcc[key] : []
            return _merge(curAccVal[idx] ? curAccVal[idx] : {}, item)
          } else {
            return item
          }
        })
      } else {
        subAcc[key] = srcVal
      }
      return subAcc
    }, acc)
  }, target)
}
// 数据转换 接口返回值中的 data 转换为 对 echarts 更友好的 value 字段
export function data2chart(data) {
  if (data) {
    if (data instanceof Object) {
      for (var k in data) {
        var val = data[k]
        if (val instanceof Array && val.length > 0) {
          val.forEach((item) => {
            item.value = item.data
            delete item.data
          })
        }
      }
    }
    if (data instanceof Array && data.length > 0) {
      data.forEach((item) => {
        item.value = item.data
        delete item.data
      })
    }
  }
  return data
}

// Echarts最大余额算法【使饼图各项相加的占比为100%】
export function getPercentValue(valueList, idx, precision) {
  // 判断是否为空
  if (!valueList[idx]) {
    return 0
  }
  // 求和
  var sum = valueList.reduce(function (acc, val) {
    return acc + (isNaN(val) ? 0 : val)
  }, 0)
  if (sum === 0) {
    return 0
  }
  // 10的2次幂是100，用于计算精度。
  var digits = Math.pow(10, precision)
  // 扩大比例100，
  var votesPerQuota = valueList.map(function (val) {
    return ((isNaN(val) ? 0 : val) / sum) * digits * 100
  })
  // 总数，扩大比例意味的总数要扩大
  var targetSeats = digits * 100
  // 再向下取值，组成数组
  var seats = votesPerQuota.map(function (votes) {
    return Math.floor(votes)
  })
  // 再新计算合计，用于判断与总数量是否相同，相同则占比会100%
  var currentSum = seats.reduce(function (acc, val) {
    return acc + val
  }, 0)
  // 余数部分的数组：原先数组减去向下取值的数组，得到余数部分的数组
  var remainder = votesPerQuota.map(function (votes, idx) {
    return votes - seats[idx]
  })
  // 给最大最大的余额加1，凑个占比100%；
  while (currentSum < targetSeats) {
    //  找到下一个最大的余额，给其加1
    var max = Number.NEGATIVE_INFINITY
    var maxId = null
    for (var i = 0, len = remainder.length; i < len; ++i) {
      if (remainder[i] > max) {
        max = remainder[i]
        maxId = i
      }
    }
    // 对最大项余额加1
    ++seats[maxId]
    // 已经增加最大余数加1，则下次判断就可以不需要再判断这个余额数。
    remainder[maxId] = 0
    // 总的也要加1，为了判断是否总数是否相同，跳出循环。
    ++currentSum
  }
  // 这时候的seats就会总数占比会100%
  return seats[idx] / digits
}
